package guida.ccf.gzuexaminesystem.controller;

import guida.ccf.gzuexaminesystem.common.Bucket;
import guida.ccf.gzuexaminesystem.dto.TestDTO;
import guida.ccf.gzuexaminesystem.entity.minio.DeleteFileDto;
import guida.ccf.gzuexaminesystem.entity.minio.SaveFileDto;
import guida.ccf.gzuexaminesystem.utils.MinioUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/minio")
public class MinioController {

    @Autowired
    private MinioUtil minioUtil;

    @Value("${minio.bucket.files}")
    private String bucket;

//    /**
//     * 单文件上传
//     *  md5 原始文件的md5值
//     * @return true 成功, false 失败
//     * @throws IOException 异常
//     */
//    @PreAuthorize("hasAnyRole('STUDENT', 'TEACHER')")
//    @RequestMapping(value = "/saveFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
//    public String upload(TestDTO testDTO) throws IOException {
//
//        List<SaveFileDto> list = new ArrayList<>();
//
//        MultipartFile[] files = testDTO.getFiles();
//        String[] md5s = testDTO.getMd5s();
//
//        if (files.length != md5s.length) {
//            return "失败!";
//        }
//
//        String folder = testDTO.getFolder();
//
//        for (int i = 0; i < files.length; ++i) {
//            // 上传到minio，且保存到数据库
//
//            SaveFileDto saveFileDto = new SaveFileDto();
//            log.error(bucket);
//            saveFileDto.setBucket(bucket);
//            saveFileDto.setFile(files[i]);
//            saveFileDto.setFolder(folder);
//            saveFileDto.setMd5(md5s[i]);
//
//            list.add(saveFileDto);
//
//        }
//
//        boolean flag = minioUtil.saveFileAll(list);
//
//        if(flag){
//            /*
//             * 文件上传成功，保存到数据库中
//             */
//            // todo 执行数据库相关操作
//            return "上传文件";
//        }else{
//            return "文件不完整，请重试上传文件";
//        }
//
//    }


    /**
     * 传入相关参数获得文件
     * @param folder 文件夹
     * @param fileName  文件名
     * @param md5  原始文件的md5值
     * @param response  响应
     */
    @PreAuthorize("hasAnyRole('STUDENT', 'TEACHER', 'ADMIN')")
    @GetMapping("/getFile")
    public String getFile(@RequestParam String folder, @RequestParam String fileName,@RequestParam String md5,
                          HttpServletResponse response) {


        boolean flag = minioUtil.getFile(bucket,folder,fileName,md5,response);

        if(flag){
            return "获得文件";
        }else{
            return "网络波动，或文件已损坏，联系管理员";
        }

    }

    /**
     * 删除单个文件
     * @return true 成功, false 失败
     */
    @PreAuthorize(
            "hasAnyAuthority(T(guida.ccf.gzuexaminesystem.expression.AuthorityUtils).getAuthoritiesByList(#list, #token, '" + Bucket.STUDENT_BUCKET + "'))"
    )
    @PostMapping("/deleteFile")
    public String deleteFile(@RequestBody ArrayList<DeleteFileDto> list, @RequestHeader("token") String token){

        boolean flag = minioUtil.deleteFileAll(list);

        if(flag){
            // todo 执行数据库
            return "文件已移除";
        }else{
            return "";
        }

    }

    @RequestMapping("/test")
    public String method1() {

        return "测试";
    }
}
